spin_lock_irq(&pending_free_lock);
+ /* tapfds[0] is always NULL */
+
for (minor = 1; minor < blktap_next_minor; minor++) {
info = tapfds[minor];
/* we could have failed a previous attempt. */
tap_blkif_t *info;
int i;
- for (i = 0; i < blktap_next_minor; i++) {
+ for (i = 1; i < blktap_next_minor; i++) {
info = tapfds[i];
if ( info &&
(info->trans.domid == domid) &&
tap_blkif_t *info;
int i;
+ /* ctrl device, treat differently */
+ if (!idx)
+ return 0;
+
info = tapfds[idx];
if ((idx < 0) || (idx > MAX_TAP_DEV) || !info) {
{
tap_blkif_t *info = filp->private_data;
- /* can this ever happen? - sdr */
- if (!info) {
- WPRINTK("Trying to free device that doesn't exist "
- "[/dev/xen/blktap%d]\n",iminor(inode) - BLKTAP_MINOR);
- return -EBADF;
- }
+ /* check for control device */
+ if (!info)
+ return 0;
+
info->dev_inuse = 0;
DPRINTK("Freeing device [/dev/xen/blktap%d]\n",info->minor);
info = tapfds[dev];
- if (!dev || (dev > MAX_TAP_DEV) || !info)
+ if ((dev > MAX_TAP_DEV) || !info)
return -EINVAL;
return info->minor;
{
tap_blkif_t *info = filp->private_data;
- if (!info) {
- WPRINTK(" poll, retrieving idx failed\n");
- return 0;
- }
-
/* do not work on the control device */
- if (!info->minor)
+ if (!info)
return 0;
poll_wait(filp, &info->wait, wait);
info = tapfds[idx];
- /* Don't kick control device minor==0 */
- if ((idx <= 0) || (idx > MAX_TAP_DEV) || !info)
+ if ((idx < 0) || (idx > MAX_TAP_DEV) || !info)
return;
wake_up_interruptible(&info->wait);
static int __init blkif_init(void)
{
int i,ret,blktap_dir;
- tap_blkif_t *info;
if (!is_running_on_xen())
return -ENODEV;
blktap_major = ret;
- info = kzalloc(sizeof(tap_blkif_t),GFP_KERNEL);
- if (!info)
- return -ENOMEM;
-
+ /* tapfds[0] is always NULL */
blktap_next_minor++;
ret = devfs_mk_cdev(MKDEV(blktap_major, i),
DPRINTK("Created misc_dev [/dev/xen/blktap%d]\n",i);
- tapfds[0] = info;
-
/* Make sure the xen class exists */
if (!setup_xen_class()) {
/*